"""
    子类在继承了父类的方法后，可以对父类已有的方法给出新的实现版本，这个动作称之为方法重写。
    通过方法重写我们可以让父类的同一个行为在子类中拥有不同的实现版本，当我们调用这个经过子类
    重写的方法时，不同的子类对象会表现出不同的行为，这就是多态(poly-morphism)。
"""


from abc import ABCMeta, abstractmethod


class Pet(object, metaclass=ABCMeta):
    # 宠物
    def __init__(self, nickname):
        self._nickname = nickname

    @abstractmethod
    def make_voice(self):
        pass


class Dog(Pet):
    # 狗
    def make_voice(self):
        print("%s:汪汪汪。。。" % self._nickname)


class Cat(Pet):
    # 猫
    def make_voice(self):
        print("%s: 喵。。。喵。。。" % self._nickname)


def main():
    pets = [Dog("旺财"), Cat("凯蒂"), Dog("大黄")]
    for pet in pets:
        pet.make_voice()


if __name__ == "__main__":
    main()